class VotesController < ApplicationController
	before_filter :charge_electeur, :except => [:augmenter_rang, :diminuer_rang]
  before_filter :est_connecte, :only => [:new, :augmenter_rang, :diminuer_rang, :destroy]
  before_filter :est_proprietaire, :only => [:new, :augmenter_rang, :diminuer_rang, :destroy]

	def charge_electeur
		@electeur=Electeur.find(params[:electeur_id])
	end

  # GET /votes/new
  # GET /votes/new.xml
  def new
    @vote = Vote.new
    @rangs = Array.new
    @candidats = Candidat.all
    @electeur.votes.each do |vote|
      @rangs.push(vote.rang)
      @candidats.delete(vote.candidat)
    end
    @rangs.push(@electeur.votes.size+1)

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @vote }
    end
  end

  # POST /votes
  # POST /votes.xml
  def create
    params[:vote][:candidat] = Candidat.find(params[:vote][:candidat])
    @vote = @electeur.votes.build(params[:vote])
    @electeur.votes.each do |vote|
      if vote.rang >= @vote.rang && !vote.eql?(@vote)
        vote.update_attribute('rang', vote.rang+1)
      end
    end
    respond_to do |format|
      if @vote.save
        flash[:notice] = 'Votre intention de vote à bien été prise en compte.'
        format.html { redirect_to electeur_url(@electeur) }
        format.xml  { render :xml => @vote, :status => :created, :location => @vote }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @vote.errors, :status => :unprocessable_entity }
      end
    end
  end

  def augmenter_rang
    @vote = Vote.find(params[:id])
    votes_trie = @vote.electeur.votes.sort{|x,y| x.rang <=> y.rang}
    if @vote.rang > 1
      vote_a_echanger = votes_trie.at(@vote.rang-2)
      @vote.update_attribute('rang', @vote.rang-1)
      if vote_a_echanger.is_a?(Vote)
        vote_a_echanger.update_attribute('rang', vote_a_echanger.rang+1)
      end
      respond_to do |format|
        flash[:notice] = 'Le rang du vote à bien été mis à jour.'
        format.html { redirect_to @vote.electeur }
      end
    else
      respond_to do |format|
        flash[:error] = 'Vous ne pouvez augmenter le rang, ce vote est déjà au premier rang.'
        format.html { redirect_to @vote.electeur }
      end
    end
  end

  def diminuer_rang
    @vote = Vote.find(params[:id])
    votes_trie = @vote.electeur.votes.sort{|x,y| x.rang <=> y.rang}
    if @vote.rang < 5 && votes_trie.at(@vote.rang).is_a?(Vote)
      vote_a_echanger = votes_trie.at(@vote.rang)
      @vote.update_attribute('rang', @vote.rang+1)
      if vote_a_echanger.is_a?(Vote)
        vote_a_echanger.update_attribute('rang', vote_a_echanger.rang-1)
      end
      respond_to do |format|
        flash[:notice] = 'Le rang du vote à bien été mis à jour.'
        format.html { redirect_to @vote.electeur }
      end
    else
      respond_to do |format|
        flash[:error] = 'Vous ne pouvez diminuer le rang, ce vote est déjà au dernier rang.'
        format.html { redirect_to @vote.electeur }
      end
    end
  end

  # DELETE /votes/1
  # DELETE /votes/1.xml
  def destroy
    @vote = Vote.find(params[:id])
    @vote.destroy

    respond_to do |format|
      format.html { redirect_to(@electeur) }
      format.xml  { head :ok }
    end
  end
end

private

def est_connecte
  unless @template.signed_in?
    flash[:notice] = "Veuillez-vous connecter pour accéder à cette page."
    redirect_to connexion_path
  end
end

def est_proprietaire
  if defined?(@electeur)
    @user = @electeur.user
  else
    @user = Vote.find(params[:id]).electeur.user
  end

  unless @template.current_user == @user
    flash[:notice] = "Vous n'avez pas le droit d'accéder à cette page."
    begin
      redirect_to :back
    rescue ActionController::RedirectBackError
      redirect_to root_path
    end
  end
end
